package game;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
 * ServerConfig 类为获取服务配置提供了支持
 * @author wizardc
 */
public class ServerConfig
{
    private static Logger logger = LogManager.getLogger("GameServer");

    // 记录该类的唯一实例
    private static ServerConfig _instance;

    // 用来获取配置文件内容的属性列表对象
    private Properties _property;

    private static final String DEFAULT_DEBUG_MODE = "on";

    private static final String DEFAULT_REMOTE_HOST = "127.0.0.1";
    private static final String DEFAULT_REMOTE_PORT = "19891";

    private static final String DEFAULT_DB_HOST = "127.0.0.1";
    private static final String DEFAULT_DB_PORT = "3306";
    private static final String DEFAULT_DB_USERNAME = "root";
    private static final String DEFAULT_DB_PASSWORD = "19891108";
    private static final String DEFAULT_DB_DATABASE = "game_db";
    private static final String DEFAULT_DB_CONNECTION_POOL_COUNT = "10";

    private static final String DEFAULT_KEEP_ALIVE_TIME = "1000";

    private static final String DEFAULT_CHAT_LOG = "on";
    private static final String DEFAULT_CHAT_LOG_PATH = "./chat.log";

    /**
     * 创建一个 ServerConfig 对象
     */
    private ServerConfig()
    {
        _property = new Properties();
    }

    /**
     * 获取该类全局唯一的实例
     * @return 该类全局唯一的实例
     */
    public static synchronized ServerConfig getInstance()
    {
        if(_instance == null)
        {
            _instance = new ServerConfig();
        }
        return _instance;
    }

    /**
     * 载入配置文件
     * @param path 要载入配置文件的地址
     */
    public void loadConfig(String path)
    {
        try
        {
            _property.load(new FileReader(path));
        }
        catch(FileNotFoundException exception)
        {
            logger.error("Can not find " + path + ", use default settings.");
        }
        catch(IOException exception)
        {
            logger.error("Can not open " + path + ", use default settings.");
        }
    }

    /**
     * 获取开发模式是否为调试模式
     * @return 开发模式是否为调试模式
     */
    public boolean getDebugMode()
    {
        String chatLog = _property.getProperty("DEBUG_MODE", DEFAULT_DEBUG_MODE);
        if(chatLog.equals("on"))
        {
            return true;
        }
        return false;
    }

    /**
     * 获取套接字服务监听的地址
     * @return 套接字服务监听的地址
     */
    public String getRemoteHost()
    {
        return _property.getProperty("REMOTE_HOST", DEFAULT_REMOTE_HOST);
    }

    /**
     * 获取套接字服务监听的端口
     * @return 套接字服务监听的端口
     */
    public int getRemotePort()
    {
        return Integer.parseInt(_property.getProperty("REMOTE_PORT", DEFAULT_REMOTE_PORT));
    }

    /**
     * 获取数据库的地址
     * @return 数据库的地址
     */
    public String getDBHost()
    {
        return _property.getProperty("DB_HOST", DEFAULT_DB_HOST);
    }

    /**
     * 获取数据库的端口
     * @return 数据库的端口
     */
    public int getDBPort()
    {
        return Integer.parseInt(_property.getProperty("DB_PORT", DEFAULT_DB_PORT));
    }

    /**
     * 获取数据库的登录用户
     * @return 数据库的登录用户
     */
    public String getDBUsername()
    {
        return _property.getProperty("DB_USERNAME", DEFAULT_DB_USERNAME);
    }

    /**
     * 获取数据库的登录密码
     * @return 数据库的登录密码
     */
    public String getDBPassword()
    {
        return _property.getProperty("DB_PASSWORD", DEFAULT_DB_PASSWORD);
    }

    /**
     * 获取数据库的主表名称
     * @return 数据库的主表名称
     */
    public String getDBDatabase()
    {
        return _property.getProperty("DB_DATABASE", DEFAULT_DB_DATABASE);
    }

    /**
     * 获取数据库连接池的连接数量
     * @return 数据库连接池的连接数量
     */
    public int getDBConnectionPoolCount()
    {
        return Integer.parseInt(_property.getProperty("DB_CONNECTION_POOL_COUNT", DEFAULT_DB_CONNECTION_POOL_COUNT));
    }

    /**
     * 获取心跳包发送间隔时间
     * @return 心跳包发送间隔时间
     */
    public int getKeepAliveTime()
    {
        return Integer.parseInt(_property.getProperty("KEEP_ALIVE_TIME", DEFAULT_KEEP_ALIVE_TIME));
    }

    /**
     * 获取聊天信息记录是否开启
     * @return 聊天信息记录是否开启
     */
    public boolean getChatLog()
    {
        String chatLog = _property.getProperty("CHAT_LOG", DEFAULT_CHAT_LOG);
        if(chatLog.equals("on"))
        {
            return true;
        }
        return false;
    }

    /**
     * 获取聊天信息记录路径
     * @return 聊天信息记录路径
     */
    public String getChatLogPath()
    {
        return _property.getProperty("CHAT_LOG_PATH", DEFAULT_CHAT_LOG_PATH);
    }
}
